I valori nulli in SQL
Il linguaggio SQL mi permette di inserire nella tabella anche righe con contenuti parziali. Negli attributi mancanti della riga sono inseriti dei valori nulli. Il simbolo NULL indica l'assenza del dato.
Un esempio pratico
La tabella Persone è composta da tre colonne/attributi (Nome, Cognome, Figli).
Inserisco una nuova riga con i valori di Cognome e Nome, senza indicare nessun valore per Figli.
INSERT INTO Persone (Nome, Cognome) VALUE ("Giuseppe", "Verdi")
Il DBMS aggiunge la nuova riga nella tabella inserendo NULL alla colonna Figli.
A cosa serve il valore NULL
Il simbolo NULL mi permette di riconoscere i valori mancanti nella tabella. Quelli di cui non sono a conoscenza.
In una espressione booleana i valori nulli non sono né veri, né falsi.
Il simbolo NULL si distingue dallo zero o da una stringa vuota, perché fornisce l'informazione che il dato manca.
Viceversa, lo zero potrebbe essere un dato stesso oppure indicare che il dato non esiste.
Nota. Quando non conosco un dato non posso affermare se esiste o meno. Forse esiste e non ne sono a conoscenza. O forse non esiste. Ad esempio, in questa tabella se al posto di NULL mettessi zero, vorrebbe dire che la persona non ha figli. L'informazione è del tutto diversa.
Per chiarire il concetto faccio un altro esempio. In questa tabella alcune persone hanno fornito il consenso alla privacy (Y) mentre altre no (N). Nell'ultima riga c'è una stringa vuota nella colonna Privacy. Cosa vuol dire? La persona ha negato la privacy? Ha fornito una risposta ma non è stata inserita in tabella? Non ha ancora risposto? Non è stata ancora contattata? Non conosciamo il dato?
Lo spazio vuoto può avere diverse interpretazioni e lascia molti dubbi. Inserire un simbolo NULL chiarisce che non conosciamo il dato.
Nella versione SQL-89 il linguaggio SQL adottava una logica a due valori (true, false) e i valori nulli erano considerati Falsi.
A partire dalle versioni SQL-2 è stata adottata una logica a tre valori (true, false, unknown) e i valori nulli non sono considerati né veri, né falsi.
Come trovare i valori NULL nella tabella
Per trovare i valori NULL in un attributo all'interno della tabella, scrivo un'interrogazione inserendo IS NULL come condizione.
Viceversa, per trovare i valori non nulli uso la condizione IS NOT NULL.
Esempio 1
Riprendo la tabella Persone
Con questa query seleziono tutte le righe che hanno valore NULL nella colonna Figli.
SELECT * FROM Persone WHERE (Figli IS NULL)
Il risultato è una tabella composta da una sola riga.
Esempio 2
Ora seleziono le righe che non hanno valori nulli nella colonna Figli.
SELECT * FROM Persone WHERE (Figli IS NOT NULL)
In questo caso il risultato è una tabella composta da tre righe.
Come impedire l'inserimento di valori nulli
Per evitare l'inserimento dei valori nulli in una colonna della tabella, devo aggiungere un vincolo NOT NULL sulla colonna (attributo) che mi interessa al momento della creazione della tabella.
Esempio
Creo la tabella Persona con il comando CREATE TABLE aggiungendo il vincolo NOT NULL alla colonna Figli.
CREATE Persone (
Nome VarChar(20),
Cognome Varchar(20),
Figli Int(2) NOT NULL
)
Il vincolo intrarelazionale NOT NULL impedisce "a monte" l'inserimento di valori nulli nella colonna Figli.
In questo modo, per inserire una nuova riga nella tabella è sempre necessario indicare un valore nell'attributo Figli.
L'inserimento di una nuova riga senza indicare un valore nell'attributo Figli viene rifiutato dal DBMS.
Nota. Questa soluzione evita che ci siano valori nulli nella colonna Figli, perché è impossibile inserire una riga con questa caratteristica. Ovviamente, i valori nulli potrebbero essere nelle altre due colonne Cognome e Nome della tabella. Per evitare anche questa ipotesi, mi basta aggiungere il vincolo NOT NULL anche a questi altri due attributi della tabella.
E così via.